<!DOCTYPE html>
<html>
<head><meta name="generator" content="Hexo 3.8.0">
  <meta charset="utf-8">
  

  
  <title>Linux Kernel 启动分析 | 章军的博客</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  <meta name="description" content="linix kernel 的启动过程我们以 arm 芯片为例子来分析 linux kernel 的启动过程. 首先我们查看 arm 的 lds 文件 (arch/arm/kernel/vmlinux.lds.S),  123OUTPUT_ARCH(arm)ENTRY(stext)…    通过 lds 文件, 可以看出 kernel 的最开始的入口函数的名字叫做 stext. 下一步是找到这个 s">
<meta name="keywords" content="Bolg">
<meta property="og:type" content="article">
<meta property="og:title" content="Linux Kernel 启动分析">
<meta property="og:url" content="http://octopuscloud.top/2019/10/17/Linux-Kernel-启动分析/index.html">
<meta property="og:site_name" content="章军的博客">
<meta property="og:description" content="linix kernel 的启动过程我们以 arm 芯片为例子来分析 linux kernel 的启动过程. 首先我们查看 arm 的 lds 文件 (arch/arm/kernel/vmlinux.lds.S),  123OUTPUT_ARCH(arm)ENTRY(stext)…    通过 lds 文件, 可以看出 kernel 的最开始的入口函数的名字叫做 stext. 下一步是找到这个 s">
<meta property="og:locale" content="China">
<meta property="og:updated_time" content="2019-10-17T09:24:39.137Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Linux Kernel 启动分析">
<meta name="twitter:description" content="linix kernel 的启动过程我们以 arm 芯片为例子来分析 linux kernel 的启动过程. 首先我们查看 arm 的 lds 文件 (arch/arm/kernel/vmlinux.lds.S),  123OUTPUT_ARCH(arm)ENTRY(stext)…    通过 lds 文件, 可以看出 kernel 的最开始的入口函数的名字叫做 stext. 下一步是找到这个 s">
  
    <link rel="alternate" href="/atom.xml" title="章军的博客" type="application/atom+xml">
  
  
    <link rel="icon" href="/favicon.png">
  
  
    <link href="//fonts.googleapis.com/css?family=Source+Code+Pro" rel="stylesheet" type="text/css">
  
  <link rel="stylesheet" href="/css/style.css">
</head>
</html>
<body>
  <div id="container">
    <div id="wrap">
      <header id="header">
  <div id="banner"></div>
  <div id="header-outer" class="outer">
    <div id="header-title" class="inner">
      <h1 id="logo-wrap">
        <a href="/" id="logo">章军的博客</a>
      </h1>
      
    </div>
    <div id="header-inner" class="inner">
      <nav id="main-nav">
        <a id="main-nav-toggle" class="nav-icon"></a>
        
          <a class="main-nav-link" href="/">Home</a>
        
          <a class="main-nav-link" href="/archives">Archives</a>
        
      </nav>
      <nav id="sub-nav">
        
          <a id="nav-rss-link" class="nav-icon" href="/atom.xml" title="RSS Feed"></a>
        
        <a id="nav-search-btn" class="nav-icon" title="Search"></a>
      </nav>
      <div id="search-form-wrap">
        <form action="//google.com/search" method="get" accept-charset="UTF-8" class="search-form"><input type="search" name="q" class="search-form-input" placeholder="Search"><button type="submit" class="search-form-submit">&#xF002;</button><input type="hidden" name="sitesearch" value="http://octopuscloud.top"></form>
      </div>
    </div>
  </div>
</header>
      <div class="outer">
        <section id="main"><article id="post-Linux-Kernel-启动分析" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/2019/10/17/Linux-Kernel-启动分析/" class="article-date">
  <time datetime="2019-10-17T08:01:02.000Z" itemprop="datePublished">2019-10-17</time>
</a>
    
  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 class="article-title" itemprop="name">
      Linux Kernel 启动分析
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <h1 id="linix-kernel-的启动过程"><a href="#linix-kernel-的启动过程" class="headerlink" title="linix kernel 的启动过程"></a>linix kernel 的启动过程</h1><pre><code>我们以 arm 芯片为例子来分析 linux kernel 的启动过程. 首先我们查看 arm 的 lds 文件 (arch/arm/kernel/vmlinux.lds.S),

<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">OUTPUT_ARCH(arm)</span><br><span class="line">ENTRY(stext)</span><br><span class="line">…</span><br></pre></td></tr></table></figure>

  通过 lds 文件, 可以看出 kernel 的最开始的入口函数的名字叫做 stext. 下一步是找到这个 stext 在哪 ? 答案是 arch/arm64/kernel/head.S 中. 
查看 head.S 文件, 我们看到是一段汇编文件 .

<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">ENTRY(stext)</span><br><span class="line">  bl    preserve_boot_args             // 保存 uboot 传入的参数</span><br><span class="line">  bl    el2_setup                      // Drop to EL1, w0=cpu_boot_mode</span><br><span class="line">  adrp  x23, __PHYS_OFFSET</span><br><span class="line">  and   x23, x23, MIN_KIMG_ALIGN - 1 // KASLR offset, defaults to 0</span><br><span class="line">  bl    set_cpu_boot_mode_flag</span><br><span class="line">  bl    __create_page_tables</span><br><span class="line">  bl    __cpu_setup                   // initialise processor</span><br><span class="line">  b     __primary_switch              // 此处跳转 __primary_switch</span><br><span class="line">ENDPROC(stext)</span><br></pre></td></tr></table></figure>

__primary_switch 同样也在 arch/arm64/kernel/head.S 中. 其他的不重要，重要的下面这三句话 , 跳转到 __primary_switched

<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">__primary_switch:</span><br><span class="line">// 此处会有一些宏来控制 kernel 的重映射 ， 以及 mmu 的使能 .</span><br><span class="line">…</span><br><span class="line">ldr  x8, =__primary_switched</span><br><span class="line">adrp x0, __PHYS_OFFSET</span><br><span class="line">blr  x8</span><br><span class="line">…</span><br><span class="line">ENDPROC(__primary_switch)</span><br></pre></td></tr></table></figure>

__primary_switched 同样在文件  arch/arm64/kernel/head.S 中 .
</code></pre><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br></pre></td><td class="code"><pre><span class="line">__primary_switched:</span><br><span class="line">    adrp x4, init_thread_union</span><br><span class="line">    add  sp, x4, #THREAD_SIZE</span><br><span class="line">    adr_l  x5, init_task</span><br><span class="line">    msr  sp_el0, x5      // Save thread_info</span><br><span class="line"></span><br><span class="line">    adr_l  x8, vectors      // load VBAR_EL1 with virtual</span><br><span class="line">    msr  vbar_el1, x8      // vector table address</span><br><span class="line">    isb</span><br><span class="line"></span><br><span class="line">    stp  xzr, x30, [sp, #-16]!</span><br><span class="line">    mov  x29, sp</span><br><span class="line"></span><br><span class="line">    str_l  x21, __fdt_pointer, x5    // Save FDT pointer</span><br><span class="line"></span><br><span class="line">    ldr_l  x4, kimage_vaddr    // Save the offset between</span><br><span class="line">    sub  x4, x4, x0      // the kernel virtual and</span><br><span class="line">    str_l  x4, kimage_voffset, x5    // physical mappings</span><br><span class="line"></span><br><span class="line">    // Clear BSS</span><br><span class="line">    adr_l  x0, __bss_start</span><br><span class="line">    mov  x1, xzr</span><br><span class="line">    adr_l  x2, __bss_stop</span><br><span class="line">    sub  x2, x2, x0</span><br><span class="line">    bl  __pi_memset</span><br><span class="line">    dsb  ishst        // Make zero page visible to PTW</span><br><span class="line"></span><br><span class="line">#ifdef CONFIG_KASAN</span><br><span class="line">      bl  kasan_early_init</span><br><span class="line">#endif</span><br><span class="line"></span><br><span class="line">#ifdef CONFIG_RANDOMIZE_BASE</span><br><span class="line">    tst  x23, ~(MIN_KIMG_ALIGN - 1)  // already running randomized?</span><br><span class="line">    b.ne  0f</span><br><span class="line">    mov  x0, x21        // pass FDT address in x0</span><br><span class="line">    bl  kaslr_early_init    // parse FDT for KASLR options</span><br><span class="line">    cbz  x0, 0f        // KASLR disabled? just proceed</span><br><span class="line">    orr  x23, x23, x0      // record KASLR offset</span><br><span class="line">    ldp  x29, x30, [sp], #16    // we must enable KASLR, return</span><br><span class="line">    ret          // to __primary_switch()</span><br><span class="line">    0:</span><br><span class="line">#endif</span><br><span class="line"></span><br><span class="line">    add  sp, sp, #16</span><br><span class="line">    mov  x29, #0</span><br><span class="line">    mov  x30, #0</span><br><span class="line">    b  start_kernel # 此处跳转到 c 文件中, 主要的初始化在此处.</span><br><span class="line"></span><br><span class="line">  ENDPROC(__primary_switched)</span><br></pre></td></tr></table></figure>
<pre><code>start_kernel　函数在 init/main.c 中:
</code></pre><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">asmlinkage __visible void __init start_kernel(void)</span><br><span class="line">&#123;</span><br><span class="line">  // </span><br><span class="line">  …</span><br><span class="line">  arch_call_rest_init();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
<pre><code>arch_call_rest_init 函数在 init/main.c 文件中
</code></pre><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">void __init __weak arch_call_rest_init(void)</span><br><span class="line">&#123;</span><br><span class="line">    rest_init();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
<pre><code>rest_init 在文件 init/main.c 中.
</code></pre><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line">noinline void __ref rest_init(void)</span><br><span class="line">&#123;</span><br><span class="line">  struct task_struct *tsk;</span><br><span class="line">  int pid;</span><br><span class="line"></span><br><span class="line">  rcu_scheduler_starting();</span><br><span class="line">  pid = kernel_thread(kernel_init, NULL, CLONE_FS);</span><br><span class="line">  rcu_read_lock();</span><br><span class="line">  tsk = find_task_by_pid_ns(pid, &amp;init_pid_ns);</span><br><span class="line">  set_cpus_allowed_ptr(tsk, cpumask_of(smp_processor_id()));</span><br><span class="line">  rcu_read_unlock();</span><br><span class="line"></span><br><span class="line">  numa_default_policy();</span><br><span class="line">  pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);</span><br><span class="line">  rcu_read_lock();</span><br><span class="line">  kthreadd_task = find_task_by_pid_ns(pid, &amp;init_pid_ns);</span><br><span class="line">  rcu_read_unlock();</span><br><span class="line"></span><br><span class="line">  system_state = SYSTEM_SCHEDULING;</span><br><span class="line"></span><br><span class="line">  complete(&amp;kthreadd_done);</span><br><span class="line"></span><br><span class="line">  schedule_preempt_disabled();</span><br><span class="line">  /* Call into cpu_idle with preempt disabled */</span><br><span class="line">  cpu_startup_entry(CPUHP_ONLINE);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
<pre><code>cpu_startup_entry 在文件 kernel/sched/idle.c 中. 等到系统的进程调度 .
</code></pre><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">void cpu_startup_entry(enum cpuhp_state state)</span><br><span class="line">&#123;</span><br><span class="line">  arch_cpu_idle_prepare();</span><br><span class="line">  cpuhp_online_idle(state);</span><br><span class="line">  while (1)</span><br><span class="line">    do_idle();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

      
    </div>
    <footer class="article-footer">
      <a data-url="http://octopuscloud.top/2019/10/17/Linux-Kernel-启动分析/" data-id="ck471vq0r000p32fzpef82ad2" class="article-share-link">Share</a>
      
      
    </footer>
  </div>
  
    
<nav id="article-nav">
  
    <a href="/2019/10/19/linux-platform-bus-总线分析/" id="article-nav-newer" class="article-nav-link-wrap">
      <strong class="article-nav-caption">Newer</strong>
      <div class="article-nav-title">
        
          linux platform bus 总线分析
        
      </div>
    </a>
  
  
    <a href="/2019/09/29/IPv6-NDP/" id="article-nav-older" class="article-nav-link-wrap">
      <strong class="article-nav-caption">Older</strong>
      <div class="article-nav-title">IPv6 NDP</div>
    </a>
  
</nav>

  
</article>

</section>
        
          <aside id="sidebar">
  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Categories</h3>
    <div class="widget">
      <ul class="category-list"><li class="category-list-item"><a class="category-list-link" href="/categories/RFC/">RFC</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/RFC-protocol/">RFC protocol</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/ReadNote/">ReadNote</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/linux/">linux</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/protocols/">protocols</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/tools/">tools</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Tags</h3>
    <div class="widget">
      <ul class="tag-list"><li class="tag-list-item"><a class="tag-list-link" href="/tags/C/">C</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Data-Struct/">Data Struct</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Ethernet-II/">Ethernet II</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Frame-Format/">Frame Format</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/I2C/">I2C</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/IPv6/">IPv6</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Neighbour-Discover-Protocol/">Neighbour Discover Protocol</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/RFC/">RFC</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/SNMP/">SNMP</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/arthmetic/">arthmetic</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/cgdb/">cgdb</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/chapter-15/">chapter 15</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/data-struct/">data struct</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/deb/">deb</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/defalt-path-for-so-file/">defalt path for so file</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/editer/">editer</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/file-system/">file system</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/gdb-debug/">gdb debug</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/hash/">hash</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/linux/">linux</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/linux-driver/">linux driver</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/platform-bus/">platform bus</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/pointer-array/">pointer, array</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/pseudocode/">pseudocode</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/rb-tree/">rb tree</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/sort/">sort</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/ssh-key/">ssh key</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/symbol/">symbol</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/tool/">tool</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/tools/">tools</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/图/">图</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/通信协议/">通信协议</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Tag Cloud</h3>
    <div class="widget tagcloud">
      <a href="/tags/C/" style="font-size: 10px;">C</a> <a href="/tags/Data-Struct/" style="font-size: 10px;">Data Struct</a> <a href="/tags/Ethernet-II/" style="font-size: 10px;">Ethernet II</a> <a href="/tags/Frame-Format/" style="font-size: 10px;">Frame Format</a> <a href="/tags/I2C/" style="font-size: 10px;">I2C</a> <a href="/tags/IPv6/" style="font-size: 15px;">IPv6</a> <a href="/tags/Neighbour-Discover-Protocol/" style="font-size: 10px;">Neighbour Discover Protocol</a> <a href="/tags/RFC/" style="font-size: 10px;">RFC</a> <a href="/tags/SNMP/" style="font-size: 10px;">SNMP</a> <a href="/tags/arthmetic/" style="font-size: 10px;">arthmetic</a> <a href="/tags/cgdb/" style="font-size: 10px;">cgdb</a> <a href="/tags/chapter-15/" style="font-size: 10px;">chapter 15</a> <a href="/tags/data-struct/" style="font-size: 15px;">data struct</a> <a href="/tags/deb/" style="font-size: 10px;">deb</a> <a href="/tags/defalt-path-for-so-file/" style="font-size: 10px;">defalt path for so file</a> <a href="/tags/editer/" style="font-size: 10px;">editer</a> <a href="/tags/file-system/" style="font-size: 10px;">file system</a> <a href="/tags/gdb-debug/" style="font-size: 10px;">gdb debug</a> <a href="/tags/hash/" style="font-size: 10px;">hash</a> <a href="/tags/linux/" style="font-size: 20px;">linux</a> <a href="/tags/linux-driver/" style="font-size: 10px;">linux driver</a> <a href="/tags/platform-bus/" style="font-size: 10px;">platform bus</a> <a href="/tags/pointer-array/" style="font-size: 10px;">pointer, array</a> <a href="/tags/pseudocode/" style="font-size: 10px;">pseudocode</a> <a href="/tags/rb-tree/" style="font-size: 10px;">rb tree</a> <a href="/tags/sort/" style="font-size: 20px;">sort</a> <a href="/tags/ssh-key/" style="font-size: 10px;">ssh key</a> <a href="/tags/symbol/" style="font-size: 10px;">symbol</a> <a href="/tags/tool/" style="font-size: 10px;">tool</a> <a href="/tags/tools/" style="font-size: 10px;">tools</a> <a href="/tags/图/" style="font-size: 10px;">图</a> <a href="/tags/通信协议/" style="font-size: 10px;">通信协议</a>
    </div>
  </div>

  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Archives</h3>
    <div class="widget">
      <ul class="archive-list"><li class="archive-list-item"><a class="archive-list-link" href="/archives/2019/12/">December 2019</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2019/11/">November 2019</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2019/10/">October 2019</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2019/09/">September 2019</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2019/08/">August 2019</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2019/07/">July 2019</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2019/06/">June 2019</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2019/05/">May 2019</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2019/04/">April 2019</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2019/03/">March 2019</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Recent Posts</h3>
    <div class="widget">
      <ul>
        
          <li>
            <a href="/2019/12/15/TMUX-使用/">TMUX-使用</a>
          </li>
        
          <li>
            <a href="/2019/11/02/linux-platform-bus-总线分析/platform/">(no title)</a>
          </li>
        
          <li>
            <a href="/2019/11/02/十二章-二叉搜索树/">算法导论-第十二章 二叉查找树</a>
          </li>
        
          <li>
            <a href="/2019/11/02/SegmentationFault-Debug/">(no title)</a>
          </li>
        
          <li>
            <a href="/2019/10/19/linux-platform-bus-总线分析/">linux platform bus 总线分析</a>
          </li>
        
      </ul>
    </div>
  </div>

  
</aside>
        
      </div>
      <footer id="footer">
  
  <div class="outer">
    <div id="footer-info" class="inner">
      &copy; 2019 zhangjun<br>
      Powered by <a href="http://hexo.io/" target="_blank">Hexo</a>
    </div>
  </div>
</footer>
    </div>
    <nav id="mobile-nav">
  
    <a href="/" class="mobile-nav-link">Home</a>
  
    <a href="/archives" class="mobile-nav-link">Archives</a>
  
</nav>
    

<script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>


  <link rel="stylesheet" href="/fancybox/jquery.fancybox.css">
  <script src="/fancybox/jquery.fancybox.pack.js"></script>


<script src="/js/script.js"></script>



  </div>
</body>
</html>